home *** CD-ROM | disk | FTP | other *** search
- Program EX_0604;
- {Listing 13P - see documentation in TUTOR.SSS}
-
- uses SSS;
- { For Pascal other than Turbo/Quick erase above line }
-
- const
- ARRIVL = 1;
- STARTA = 2;
- ENDACT = 3;
- NEXTAC = 4;
-
- ORDNRY = 0;
- DELUX = 1;
-
- { For MS Pascal $include:'SSSP1.H' }
-
- var
- i, id, server, ecode : integer;
-
- { For MS Pascal $include:'SSSP2.H' }
-
- procedure prime;
- begin
- server := 2;
- id := 0;
- INIQUE(2,3,1);
- INISTA(1,'Interrupts',0,0,0,0);
- SIMEND(60);
- CREATE(0.0, 0);
- end;
-
- procedure preemp;
- var i: integer; remt: real;
-
- begin
- QUEUE(2, 0);
- i := 1;
- while ((i <= NC) and
- ((AIC(i,3) = DELUX) or (NEIC(i) <> ENDACT))) do
- i := i + 1;
- if i <= NC then
-
- begin
- remt := TIC(i) - T;
- REMVFC(i);
- SETA(1, A(1) + 1);
- SETA(2, remt);
- SETQDC(1,'LIFO');
- QUEUE(1, 0);
- SETQDC(1,'FIFO');
- REMVFQ(2,1);
- SCHED(0, STARTA, IDE);
- end;
- end;
-
- begin
-
- prime;
-
- repeat
- ecode := NEXTEV;
- if ecode > 0 then
- begin
- case ecode of
-
- ARRIVL: begin
- id := id + 1;
- CREATE(EX(2), id);
- SETA(1, 0);
- SETA(2, TR(1,2,3));
- if RA < 0.25 then SETA(3, DELUX )
- else SETA(3, ORDNRY);
- SCHED(0.0, NEXTAC, IDE);
- end;
-
- NEXTAC: if server > 0 then SCHED(0, STARTA, IDE)
- else if A(3) = DELUX then preemp
- else QUEUE(1, 0);
-
- STARTA: begin
- SCHED(A(2), ENDACT, IDE);
- server := server - 1;
- end;
-
- ENDACT: begin
- if IDE <> DELUX then TALLY(1,A(1));
- DISPOS;
- server := server + 1;
- if NQ(2) > 0 then
- begin
- REMVFQ(2,1);
- SCHED(0, STARTA, IDE);
- end else if NQ(1) > 0 then
-
- begin
- REMVFQ(1,1);
- SCHED(0, STARTA, IDE);
- end;
- end;
- end;
- end;
-
- until ecode = 0;
-
- SUMRY('');
-
- end.